package com.winbomb.kingcard;

public interface IBattle {

	/**
	 * 构造一场新的战斗
	 * 
	 * @param attacker
	 * @param defender
	 */
	public void newBattle(IPlayer attacker, IPlayer defender);

	/**
	 * 准备战斗
	 * 
	 * 主要完成比将的工作,根据比将的结果决定谁先进行行动
	 */
	public void prepare();

	/**
	 * 开始战斗
	 */
	public void start();

	/**
	 * 开始一次进攻,返回值表示这次进攻是否成功(即此次attacker是否击败了defender)
	 * 
	 * @return
	 */
	public boolean fight();

	/**
	 * 判定战斗的结果,依据依次为:
	 * 
	 * 1. 剩余牌数
	 * 
	 * 2. 剩余点数
	 * 
	 * 3. 剩余最大牌
	 * 
	 * 4. 进攻优先
	 * 
	 * 返回值表示是否是Invader获胜
	 * 
	 * @return
	 */
	public boolean judge();

	/**
	 * 结束战斗
	 */
	public void finish();

	/**
	 * 战争结束后,由胜利者从战败的牌中挑选两张
	 */
	public void pickCaptives();

	/**
	 * 侵略者
	 * 
	 * @return
	 */
	public IPlayer getInvader();

	/**
	 * 战斗发起者
	 * 
	 * @return
	 */
	public IPlayer getInvoker();

	/**
	 * 发起者攻击目标
	 * 
	 * @return
	 */
	public IPlayer getTarget();

	/**
	 * 保卫者
	 * 
	 * @return
	 */
	public IPlayer getGuarder();

	/**
	 * 获取进攻者
	 * 
	 * @param player
	 */
	public IPlayer getAttacker();

	/**
	 * 获取被进攻者
	 * 
	 * @param player
	 */
	public IPlayer getDefender();

	/**
	 * 获得侵略的卡片
	 * 
	 * @return
	 */
	public ICard[] getInvadeCards();

	/**
	 * 获取进攻者的卡片
	 * 
	 * @return
	 */
	public ICard[] getAtkCards();

	/**
	 * 获得保卫的卡片
	 * 
	 * @return
	 */
	public ICard[] getGuardCards();

	/**
	 * 获取防守者的卡片
	 * 
	 * @return
	 */
	public ICard[] getDefCards();

	/**
	 * 获得战胜者
	 * 
	 * @return
	 */
	public IPlayer getWinner();

	/**
	 * 获得胜者的牌
	 * 
	 * @return
	 */
	public ICard[] getWinnerCards();

	/**
	 * 获得获胜的级别
	 * 
	 * @return
	 */
	public int getWinLevel();

	/**
	 * 是否是侵略者胜利了
	 * 
	 * @return
	 */
	public boolean isInvaderWin();

	/**
	 * 获得战败者
	 * 
	 * @return
	 */
	public IPlayer getLoser();

	/**
	 * 获得负者的牌
	 * 
	 * @return
	 */
	public ICard[] getLoserCards();

	/**
	 * 获得失败的级别
	 * 
	 * @return
	 */
	public int getLoseLevel();

	/**
	 * 设置当前的进攻卡片
	 * 
	 * @param cardIdx
	 *            进攻卡片的序号
	 */
	public void setCurrAtkCard(int cardIdx);

	/**
	 * 获取当前的进攻卡片
	 * 
	 * @return
	 */
	public ICard getCurrAtkCard();

	/**
	 * 获得当前进攻卡片的索引
	 * 
	 * @return
	 */
	public int getCurrAtkCardIdx();

	/**
	 * 设置当前进攻卡片要进攻的对象
	 * 
	 * @param cardIdx
	 *            进攻对象的索引号
	 */
	public void setCurrAtkTarget(int cardIdx);

	/**
	 * 获得当前进攻卡片要进攻的对象
	 * 
	 * @return
	 */
	public ICard getCurrAtkTarget();

	/**
	 * 获得当前进攻对象的索引号
	 * 
	 * @return
	 */
	public int getCurrAtkTargetIdx();

	/**
	 * 获得当前攻击卡片有能力攻击的所有卡片,包括
	 * 
	 * 1. 进攻牌可以攻击成功的明牌（已经翻开的牌）
	 * 
	 * 2. 任意暗牌（尚未翻开的牌）
	 * 
	 * @return
	 */
	public ICard[] getAtkableTargets();

	/**
	 * 获得本次战斗中战败的卡片
	 * 
	 * @return
	 */
	public ICard[] getDefeatedCards();

	/**
	 * 切换进攻和防守的双方
	 */
	public void changeTurn();

	/**
	 * 获得当前回合的操作者
	 */
	public IPlayer getCurrTurner();

	/**
	 * 是否是全歼敌军,如果是全歼,可以追击.
	 * 
	 * @return
	 */
	public boolean isKillAll();

	/**
	 * 胜者追击
	 */
	public void chaseAttack();

	public int getInvadeLoss();

	public int getGuardLoss();

	/**
	 * 战斗是否已经开始
	 * 
	 * @return
	 */
	public boolean isStarted();

	/**
	 * 获取先手玩家
	 * 
	 * @return
	 */
	public IPlayer getFirstHandPlayer();
}
